Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
JDialog
Класс JDialog расширяет класс Dialog библиотеки AWT и является «тяжеловесным» компонентом.
Он создает модальные или немодальные диалоговые окна.
Напомним, что модальное окно блокирует графический интерфейс пользователя, пока не будет закрыто.
Каждое диалоговое окно обязательно связано с родительским AWT окном Window, Dialog или Frame.
Диалоговое окно снабжено рамкой и строкой заголовка, в которую помещается строка, записанная в конструкторе.
В строке заголовка есть кнопка Закрыть, реакцию на которую, а заодно и реакцию на нажатие комбинации клавиш <Alt> + <F4>, можно установить методом setDefaultCloseOperation.
Модальность окна и его заголовок можно изменить методами setModalityType и setTitle.
По умолчанию диалоговое окно может изменять свои размеры, но это правило можно поменять унаследованным методом setResizable.
Как уже говорилось ранее, Swing предоставляет контейнеры верхнего уровня: JFrame, JDialog и JWindow.
При использовании этих классов, чтобы отображаться на экране, каждый компонент GUI должен быть частью иерархии компонентов, в которой в качестве корня используется контейнер верхнего уровня.
При этом каждый GUI компонент может содержаться только один раз.
Если компонент уже находится в контейнере, и вы пытаетесь добавить его в другой контейнер, компонент будет удален из первого контейнера, а затем добавлен ко второму.
Каждый контейнер верхнего уровня имеет панель содержимого contentPane, которая содержит видимые компоненты контейнера верхнего уровня.
Вы можете дополнительно добавить панель меню в контейнер верхнего уровня.
Панель меню расположена в контейнере верхнего уровня, но вне панели содержимого.
Получить панель содержимого контейнера верхнего уровня можно с помощью метода getContentPane.
Панель содержимого по умолчанию – это простой промежуточный контейнер, который наследуется от JComponent и использует BorderLayout в качестве менеджера компоновки.
Однако можно создать панель JPanel и установить ее как панель содержимого, используя метод setContentPane контейнера верхнего уровня.
Вы можете напрямую добавлять компоненты в контейнер верхнего уровня методом add, при этом они будут добавляться в панель содержимого.
Устройство контейнера верхнего уровня еще более сложное, чем это кажется на первый взгляд.
Каждый контейнер верхнего уровня использует промежуточный контейнер, называемый корневой панелью root pane.
Корневая панель управляет панелью содержимого и панелью меню вместе с несколькими другими контейнерами.
Здесь слоистая панель layered pane содержит панель меню и панель содержимого и обеспечивает упорядочивание других компонентов по оси Z.
Стеклянная панель glass pane часто используется для перехвата входных событий, проходящих через контейнер верхнего уровня, а также может использоваться для рисования поверх нескольких компонентов.
Здесь показан пример создания пользовательского диалога.
В конструкторе класса используется панель содержимого для создания интерфейса диалога.
Также переопределяется метод createRootPane, который создает корневую панель, для закрытия диалога при нажатии кнопки «Escape».
В этом методе используется метод getKeyStroke класса KeyStroke для установки нажатия клавиши ESCAPE.
Также создается действие AbstractAction, реализующее метод actionPerformed, в котором используются методы setVisible и dispose, чтобы сделать окно невидимым и удалить его.
Таким образом определенные KeyStroke и AbstractAction используются в созданной корневой панели JRootPane.
Метод getInputMap класса JRootPane используется для получения входной карты, когда компонент имеет фокус.
Во входной карте мы устанавливаем нажатие клавиши «ESCAPE».
Мы также получаем карту действия ActionMap, чтобы связать действие и нажатие клавиши.
Glass Pane
Здесь показан пример использования панели Glass Pane для рисования поверх компонентов, содержащихся в панели содержимого.
Пользовательская панель Glass Pane устанавливается для контейнера верхнего уровня методом setGlassPane.
Так как по умолчанию она невидима, для нее нужно вызвать метод setVisible (true).
Панель по умолчанию можно получить методом getGlassPane контейнера верхнего уровня.
Слоистая панель Layered Pane представляет собой контейнер с глубиной, так что перекрывающиеся компоненты могут отображаться один поверх другого.
Каждая корневая панель root pane контейнера верхнего уровня помещает панель меню и панель содержимого в экземпляр слоистой панели JLayeredPane.
Порядок Z слоистой панели обеспечивает такое поведение, как отображение всплывающих меню над другими компонентами.
Слоистая панель может использоваться для размещения компонентов один над другим по оси Z, создавая таким образом 3D эффект глубины.
Панель по умолчанию можно получить методом getLayeredPane контейнера верхнего уровня.
Установить пользовательскую панель для контейнера верхнего уровня можно методом setLayeredPane.
Компоненты добавляются в панель методом add, при этом указывается позиция на оси Z компонента.
По умолчанию слоистая панель не имеет менеджера компоновки, поэтому для размещения компонентов используется метод setBounds.
JInternalFrame
С помощью классов JInternalFrame и JDesktopPane можно создавать многооконные приложения, в которых программа имеет одну большую панель «рабочий стол», которая содержит все остальные окна.
Другие окна могут быть минимизированы и перемещаться в пределах этой панели рабочего стола, но не перемещается за пределы панели.
Кроме того, минимизация панели рабочего стола скрывает все содержащиеся окна.
Класс JDesktopPane расширяет класс JLayeredPane специально для работы с внутренними окнами JInternalFrame.
Объект JDesktopPane представляет собой контейнер, используемый для создания интерфейса с несколькими документами или виртуального рабочего стола.
Вы создаете объекты JInternalFrame и добавляете их в объект JDesktopPane.
Объект JInternalFrame представляет собой легковесный объект, который обеспечивает многие функции нативного или тяжеловесного фрейма, включая перетаскивание, закрытие, минимизирование, изменение размера, отображение заголовка и поддержку строки меню.
Каждое внутреннее окно JInternalFrame содержит корневую панель JRootPane.
При использовании внутренних окон вы должны установить их размер.
Если вы не установите размер внутреннего фрейма, он будет иметь нулевой размер и, следовательно, никогда не будет виден.
Вы можете установить размер, используя один из методов setSize, pack или setBounds.
Также вы должны установить местоположение внутреннего фрейма.
Если вы не установите местоположение внутреннего фрейма, он будет установлен в верхний левый угол контейнера.
Вы можете использовать метод setLocation или setBounds, чтобы указать верхнюю левую точку внутреннего фрейма относительно контейнера.
Диалоги для внутренних фреймов должны быть реализованы с использованием JOptionPane или JInternalFrame, а не JDialog, который является тяжеловесным контейнером.
По умолчанию внутренние фреймы невидимы, поэтому для их отображения нужно вызвать метод setVisible (true) или show.
При создании внутреннего фрейма нужно явно указывать, что он содержит кнопки Свернуть, Развернуть, Закрыть, и может изменять размеры.
JOptionPane
Хотя класс JDialog позволяет создавать любые диалоговые окна, в подавляющем большинстве случаев их назначение сводится к выводу сообщений, подтверждению или отмене каких-то действий и вводу данных.
Класс JOptionPane предоставляет большой набор статических методов для создания модальных диалоговых окон.
Класс JOptionPane не расширяет класс JDialog, а напрямую расширяет класс JComponent, и является скорее фабрикой для создания диалоговых окон, чем просто компонентом.
Класс JOptionPane предоставляет методы showMessageDialog с разными аргументами, создающие окна сообщений.
Методы